{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implementation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Several Python libraries allow for easy and efficient implementation of neural networks. Here, we'll show examples with the very popular `tf.keras` submodule. This submodule integrates Keras, a user-friendly high-level API, into Tensorflow, a lower-level backend. Let's start by loading Tensorflow, our visualization packages, and the {doc}`Boston </content/appendix/data>` housing dataset from `scikit-learn`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from sklearn import datasets\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "boston = datasets.load_boston()\n",
    "X_boston = boston['data']\n",
    "y_boston = boston['target']\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Neural networks in Keras can be fit through one of two APIs: the *sequential* or the *functional* API. For the type of models discussed in this chapter, either approach works. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. The Sequential API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fitting a network with the Keras sequential API can be broken down into four steps: \n",
    "\n",
    "1. Instantiate model\n",
    "2. Add layers\n",
    "3. Compile model (and summarize)\n",
    "4. Fit model\n",
    "\n",
    "An example of the code for these four steps is shown below. We first instantiate the network using `tf.keras.models.Sequential()`. \n",
    "\n",
    "Next, we add layers to the network. Specifically, we have to add any hidden layers we like followed by a single output layer. The type of networks covered in this chapter use only `Dense` layers. A \"dense\" layer is one in which each neuron is a function of all the other neurons in the previous layer. We identify the number of neurons in the layer with the `units` argument and the activation function applied to the layer with the `activation` argument. For the first layer only, we must also identify the `input_shape`, or the number of neurons in the input layer. If our predictors are of length `D`, the input shape will be `(D, )` (which is the shape of a single observation, as we can see with `X[0].shape`).\n",
    "\n",
    "The next step is to compile the model. Compiling determines the configuration of the model; we specify the optimizer and loss function to be used as well as any metrics we would like to monitor. After compiling, we can also preview our model with `model.summary()`.\n",
    "\n",
    "Finally, we fit the model. Here is where we actually provide our training data. Two other important arguments are `epochs` and `batch_size`. Models in Keras are fit with *mini-batch gradient descent*, in which samples of the training data are looped through and individually used to calculate and update gradients. `batch_size` determines the size of these samples, and `epochs` determines how many times the gradient is calculated for each sample. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"Sequential_Model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "hidden (Dense)               (None, 8)                 112       \n",
      "_________________________________________________________________\n",
      "output (Dense)               (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 121\n",
      "Trainable params: 121\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "## 1. Instantiate\n",
    "model = tf.keras.models.Sequential(name = 'Sequential_Model')\n",
    "\n",
    "## 2. Add Layers\n",
    "model.add(tf.keras.layers.Dense(units = 8,\n",
    "                                activation = 'relu',\n",
    "                                input_shape = (X_boston.shape[1], ),\n",
    "                                name = 'hidden'))\n",
    "model.add(tf.keras.layers.Dense(units = 1,\n",
    "                                activation = 'linear',\n",
    "                                name = 'output'))\n",
    "\n",
    "## 3. Compile (and summarize)\n",
    "model.compile(optimizer = 'adam', loss = 'mse')\n",
    "print(model.summary())\n",
    "\n",
    "## 4. Fit\n",
    "model.fit(X_boston, y_boston, epochs = 100, batch_size = 1, validation_split=0.2, verbose = 0);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Predictions with the model built above are shown below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create Predictions\n",
    "yhat_boston = model.predict(X_boston)[:,0]\n",
    "\n",
    "# Plot\n",
    "fig, ax = plt.subplots()\n",
    "sns.scatterplot(y_boston, yhat_boston)\n",
    "ax.set(xlabel = r\"$y$\", ylabel = r\"$\\hat{y}$\", title = r\"$y$ vs. $\\hat{y}$\")\n",
    "sns.despine()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Functional API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fitting models with the Functional API can again be broken into four steps, listed below.\n",
    "\n",
    "1. Define layers\n",
    "2. Define model\n",
    "3. Compile model (and summarize)\n",
    "4. Fit model\n",
    "\n",
    "While the sequential approach first defines the model and then adds layers, the functional approach does the opposite. We start by adding an input layer using `tf.keras.Input()`. Next, we add one or more hidden layers using `tf.keras.layers.Dense()`. Note that in this approach, we link layers directly. For instance, we indicate that the `hidden` layer below follows the `inputs` layer by adding `(inputs)` to the end of its definition. \n",
    "\n",
    "After creating the layers, we can define our model. We do this by using `tf.keras.Model()` and identifying the input and output layers. Finally, we compile and fit our model as in the sequential API. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"Functional_Model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input (InputLayer)           [(None, 13)]              0         \n",
      "_________________________________________________________________\n",
      "first_hidden (Dense)         (None, 8)                 112       \n",
      "_________________________________________________________________\n",
      "output (Dense)               (None, 1)                 9         \n",
      "=================================================================\n",
      "Total params: 121\n",
      "Trainable params: 121\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "## 1. Define layers\n",
    "inputs = tf.keras.Input(shape = (X_boston.shape[1],), name = \"input\")\n",
    "hidden = tf.keras.layers.Dense(8, activation = \"relu\", name = \"first_hidden\")(inputs)\n",
    "outputs = tf.keras.layers.Dense(1, activation = \"linear\", name = \"output\")(hidden)\n",
    "\n",
    "## 2. Model\n",
    "model = tf.keras.Model(inputs = inputs, outputs = outputs, name = \"Functional_Model\")\n",
    "\n",
    "## 3. Compile (and summarize)\n",
    "model.compile(optimizer = \"adam\", loss = \"mse\")\n",
    "print(model.summary())\n",
    "\n",
    "## 4. Fit\n",
    "model.fit(X_boston, y_boston, epochs = 100, batch_size = 1, validation_split=0.2, verbose = 0);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Predictions formed with this model are shown below. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create Predictions\n",
    "yhat_boston = model.predict(X_boston)[:,0]\n",
    "\n",
    "# Plot\n",
    "fig, ax = plt.subplots()\n",
    "sns.scatterplot(y_boston, yhat_boston)\n",
    "ax.set(xlabel = r\"$y$\", ylabel = r\"$\\hat{y}$\", title = r\"$y$ vs. $\\hat{y}$\")\n",
    "sns.despine()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
